package com.ellecity06.common.utils

import android.annotation.SuppressLint
import android.util.Log
import com.ellecity06.common.delegate.mmkvBool
import com.ellecity06.common.delegate.mmkvLong
import java.util.*

/**
 * @author ellecity06
 * @time 2022/11/10 16:23
 * @des 应用无操作超时处理
 */
class ActivityMonitor {
    private var timerTask: TimerTask? = null
    private var timer: Timer? = null

    /**
     * 最后保存的时间
     */
    private var saveLastTime by mmkvLong("saveLastTime", System.currentTimeMillis())

    /**
     * 最后操作的时间
     */
    private var lastTime = System.currentTimeMillis()

    /**
     * 是否操作超时
     */
    private var actionTimeout by mmkvBool("actionTimeout", false)

    /**
     * 计时器间隔
     */
    private val intervalTime: Long = 5 * 1000
    private var tokenExpireTime = 30000

    companion object {
        @JvmStatic
        fun get(): ActivityMonitor {
            return Holder.holder
        }
    }

    object Holder {
        @SuppressLint("StaticFieldLeak")
        val holder = ActivityMonitor()
    }

    fun update() {
        if (isTimeout()) {
            cancel()
            return
        }
        lastTime = System.currentTimeMillis()
        createDisposable()
    }

    fun reset() {
        saveLastTime = System.currentTimeMillis()
        actionTimeout = false
    }

    private fun createDisposable() {
        if (timerTask == null) {
            timerTask = object : TimerTask() {
                override fun run() {
                    // 用当前点击的时间减去上一次操作的时间 比较是否超时，考虑计时器间隔五秒的问题所以提前五秒
                    val time = saveLastTime - lastTime
                    if (time > tokenExpireTime - intervalTime) {
                        // 这个时候已经超时了 ，把定时器取消
                        actionTimeout = true
                        cancel()

                    } else {
                        actionTimeout = false
                        // 如果当前还没超时就保存最后操作的时间
                        saveLastTime = System.currentTimeMillis()

                    }
                }
            }
            timer = Timer()
            timer!!.schedule(timerTask, 0, intervalTime)

        }
    }

    fun cancel() {
        Log.e("zavier_disposable", "取消定时器")
        timer?.also {
            it.cancel()
            timer = null
        }
        timerTask?.also {
            it.cancel()
            timerTask = null
        }
    }

    /**
     * 每次点击保存点击的时间，当无操作的时候保存超时的时间，判断超时的条件就是当前的时间 减去 最后点击的时间 大于超时时间
     */
    fun isTimeout(): Boolean {
        return if (System.currentTimeMillis() - saveLastTime > tokenExpireTime) true else actionTimeout

    }
}